package com.swak.utils;

import org.springframework.beans.BeanUtils;
import org.springframework.cglib.beans.BeanCopier;

/**
 * Bean 拷贝， 列举了目前比较好用的两种方式
 * 
 * @author 618lf
 */
public class Beans {

	/**
	 * 这里直接调用的是Spring 的 属性复制， 使用的是通过反射的方式调用 set 和 get 方式
	 * 所以性能上不是很好但是能很好的支持   @Accessors(chain = true)
	 * 
	 * @param source
	 * @param target
	 */
	public static void copyProperties(Object source, Object target) {
		BeanUtils.copyProperties(source, target);
	}

	/**
	 * 这里使用的Spring + cglib 的属性复制，不支持  @Accessors(chain = true)
	 * 但是如果需要使用，需要改进，BeanCopier.create 比较耗性能，可以缓存在threadLocal中
	 * 
	 * 这里的原理就是直接生成了代理类来实现对象的拷贝，类似硬编码的实现
	 * 
	 * @param source
	 * @param target
	 */
	@Deprecated
	public static void beanCopier(Object source, Object target) {
		BeanCopier copier = BeanCopier.create(source.getClass(), target.getClass(), false);
		copier.copy(source, target, null);
	}
}
